/*
 * 작성일 : 2014. 10. 29.
 * 작성자 : hch1982
 *
 * 설명
*/ 
/**
 * 
 */
package springbook.user.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import springbook.user.domain.User;

/**
 * @author hch1982
 *
 * 코드 수정 히스토리
 * 날짜		작업자		태그
 * 2014. 10. 29.	hch1982	
 */
public class UserDao {
	/*
	 * 3. 클래스 분리
	 * 새로운 클래스를 dao 내부에 선언하여 사용
	 * 
	 * => dao와 해당 클래스가 밀접한 관계를 갖게 됨. 다른 db에 적용 x(메서드가 동일하지 않는 경우도..)
	 * 
	 */
//	private SimpleConnectionMaker simpleConnectionMaker;
	
	/*
	 * 4. 인터페이스의 도입
	 */
	private ConnectionMaker connectionMaker;
	
	public UserDao(ConnectionMaker connectionMaker){
		//4.a. DConnectionMaker 종속적인 클래스
//		connectionMaker = new DConnectionMaker();
		super();
		this.connectionMaker = connectionMaker;
	}
	
	/*
	 * 제어의 역전
	 * 싱글톤 패턴
	 *  => 상속 불가, 테스트 어려움, 서버환경에서는 싱글톤이 하나만 만들어지는 것을 보장할 수 없다. 전역상태를 만들 수 있기 때문에
	 */
	
//	private static UserDao INSTANCE;
//	private UserDao(ConnectionMaker connectionMaker){
//		this.connectionMaker = connectionMaker;
//	}
	
//	public static synchronized UserDao getInstance(){
//		if(INSTANCE ==null){
//			INSTANCE = new UserDao();
//		}
//		return INSTANCE;
//	}
	/**
	 * @param connectionMaker the connectionMaker to set
	 *  4.b. ConnectionMaker Setter 메서드를 추가 (외부에서 만든 것을 가져오게)
	 */
	public void setConnectionMaker(ConnectionMaker connectionMaker) {
		this.connectionMaker = connectionMaker;
	}



	public void add(User user) throws ClassNotFoundException, SQLException {
		Connection conn =connectionMaker.getConnection();
		PreparedStatement psmt = conn.prepareStatement("insert into tb_sp_user(id, name, password) values(?,?,?)");
		psmt.setString(1, user.getId());
		psmt.setString(2, user.getName());
		psmt.setString(3, user.getPassword());
		
		psmt.executeUpdate();
		
		psmt.close();
		conn.close();
	}
	
	public User get(String id) throws ClassNotFoundException, SQLException{
		Connection conn = connectionMaker.getConnection();
		PreparedStatement psmt = conn.prepareStatement("select * from tb_sp_user where id = ?");
		psmt.setString(1, id);
		
		ResultSet rs = psmt.executeQuery();
		
		rs.next();
		User user = new User();
		user.setId(rs.getString("id"));
		user.setName(rs.getString("name"));
		user.setPassword(rs.getString("password"));
		
		rs.close();
		psmt.close();
		conn.close();
		
		return user;
	}
	
/*
 * 	1. 관심사의 분리 : 동일하게 반복되는 부분을 분리 
 *     2. 팩토리 메소드 패턴, 템플릿 메소드 패턴 사용 : 다른 종류의 DB에 따라 Connection을 가져오는 기법이 다른 경우
 *     => 상속을 통한 상하위 클래스 관계는 생각보다 밀접, 슈퍼클래스 변경에 따라서 서브 클래스 변경이 일어날 수도
 *           DAO에 따라서 클래스가 계속해서 늘어남..
 */
//	public abstract Connection getConnection()  throws ClassNotFoundException, SQLException;
}
